package tools

import (
	"bufio"
	"crypto/md5"
	"encoding/hex"
	"fmt"
	"io"
	"net/http"
	"os"
	"regexp"
	"strconv"
	"strings"
	"time"
)

func StrGetCmd() (word string, err error) {
	//使用os.Stdin开启输入流
	//函数原型 func NewReader(rd io.Reader) *Reader
	//NewReader创建一个具有默认大小缓冲、从r读取的*Reader 结构见官方文档
	in := bufio.NewReader(os.Stdin)
	//in.ReadLine函数具有三个返回值 []byte bool error
	//分别为读取到的信息 是否数据太长导致缓冲区溢出 是否读取失败
	str, _, err := in.ReadLine()
	if err != nil {
		return string(str), err
	}
	str = []byte(StrRemoveSpace(string(str)))
	return string(str), nil
}

func StrRemoveSpace(str string) string {
	str = strings.Replace(str, " ", "", -1)
	// 去除换行符
	str = strings.Replace(str, "\n", "", -1)
	return str
}

//
//  removeRepByMap
//  @Description: 切片去重
//  @param slc
//  @return []string
//
func RemoveRepByMap(slc []string) []string {
	result := []string{}         //存放返回的不重复切片
	tempMap := map[string]byte{} // 存放不重复主键
	for _, e := range slc {
		l := len(tempMap)
		tempMap[e] = 0 //当e存在于tempMap中时，再次添加是添加不进去的，，因为key不允许重复
		//如果上一行添加成功，那么长度发生变化且此时元素一定不重复
		if len(tempMap) != l { // 加入map后，map长度变化，则元素不重复
			result = append(result, e) //当元素不重复时，将元素添加到切片result中
		}
	}
	return result
}

func DownloadImg(images []string, dir string) bool {
	for image_key, image_url := range images {
		reg, _ := regexp.Compile(`\w+\.(?:jpg|gif|bmp|bnp|png|jpeg)`)
		image_name := ""
		if image_reg := reg.FindStringSubmatch(image_url); len(image_reg) < 1 {
			image_name = Md5V(strconv.Itoa(int(time.Now().UnixNano())))
		} else {
			image_name = image_reg[0]
		}
		//通过http请求获取图片的流文件
		resp, err := http.Get(image_url)
		if err != nil {
			fmt.Println("出错：", err)
		}
		defer resp.Body.Close()
		dir := ""
		//是否同一个目录

		dir = "./allbiaoqing4/"

		if !createDir(dir) {
			continue
		}
		//检测文件是否已经存在
		isExists, err := PathExists(dir + image_name)
		if isExists {
			fmt.Printf("%d.下载文件已经存在，不再下载哦\r\n", image_key+1)
			continue
		}
		out, err := os.Create(dir + image_name)
		if err != nil {
			fmt.Println("新建目录错误", err)
			continue
		}
		wt := bufio.NewWriter(out)
		defer out.Close()

		n, err := io.Copy(wt, resp.Body)
		if err != nil {
			//panic(err)
			fmt.Printf("%d.下载失败：%d %s\r\n", image_key+1, n, err)
		} else {
			fmt.Printf("%d.下载成功：%d %s\r\n", image_key+1, n, image_url)
		}
		wt.Flush()
	}
	return true
}
//
//  md5V
//  @Description: 生成md5
//  @param str
//  @return string
//
func Md5V(str string) string  {
	h := md5.New()
	h.Write([]byte(str))
	return hex.EncodeToString(h.Sum(nil))
}

//
//  md5V2
//  @Description: 生成md5
//  @param str
//  @return string
//
func Md5V2(str string) string {
	data := []byte(str)
	has := md5.Sum(data)
	md5str := fmt.Sprintf("%x", has)
	return md5str
}

//
//  md5V3
//  @Description: 生成md5
//  @param str
//  @return string
//
func Md5V3(str string) string {
	w := md5.New()
	io.WriteString(w, str)
	md5str := fmt.Sprintf("%x", w.Sum(nil))
	return md5str
}